/**
 * 给定N个数，将其划分为D组，每组的和记作xi，则对x有一个方差
 * 需要划分使得方差最小，求这个最小方差。N和D在15，显然状压DP 
 * 注意到方差的公式：
 *   1
 *  --- SIGMA{ (xi - xba) ^ 2 } 
 *   D
 * 
 * 其中 xba = SIGMA{A} / D，是不变的。
 * 令D[k][status]为分k组选择status情况下的最小值
 * 则： D[k][s] = min{D[k-1][s-t], D[t][1], t是s的所有非空子集}
 * 
 * 还可以将目标改一下，注意到方差公式，可以将规划目标改为: SIGMA{xi ^ 2}
 * 然后再计算，但是WA14个点，怀疑是小数点的问题
 * 因为将类型改为long double以后就只wa了6个点 
*/
#include <bits/stdc++.h>
using namespace std;

#include <bits/extc++.h>
using namespace __gnu_pbds;

using Real = double;
using llt = long long;
using pii = pair<int, int>;
using vi = vector<int>;

llt const INF = 0x7F7F7F7FFFFFFFFF;

int N, D;
vector<llt> W;

Real proc(){
    auto sum = accumulate(W.begin(), W.end(), 0LL);
    Real average = (Real) sum / D;

    vector<vector<Real>> d(D + 1, vector<Real>(1<<N, 0));
    for(int i=1,n=1<<N;i<n;++i){
        llt t = 0;
        for(int j=0;j<N;++j){
            if((1<<j)&i) t += W[j];
        }
        d[1][i] = (t - average) * (t - average);
    }

    for(int k=2;k<=D;++k)for(int i=1,n=1<<N;i<n;++i){
        auto & ans = d[k][i];
        ans = 1E100;
        /// 这个循环能遍历i的所有子集
        for(int st=(i-1)&i;st;st=st-1&i){
            ans = min(ans, d[k-1][i-st] + d[1][st]);
        }
    }

    auto tmp = d[D][(1<<N)-1];
    auto ans = (Real)tmp / D;
    return ans;
}


int main(){
#ifndef ONLINE_JUDGE
    freopen("z.txt", "r", stdin);
#endif
    ios::sync_with_stdio(false);cin.tie(nullptr);cout.tie(0);
    int nofakse = 1;
    // cin >> nofakse;
    while(nofakse--){
        cin >> N >> D;
        W.assign(N, 0);
        for(auto & i : W) cin >> i;
        cout << fixed << setprecision(12) << proc() << endl;
    }
    return 0;
}